package com.File.mojo;

import java.io.Serializable;

/**
 * 自定义序列化对象
 * 将Person类的对象序列化，持久到硬盘上
 * 然后反序列化回来
 *
 * Person需要满足如下的要求，方可序列化
 * 1. 实现Serializable接口，Serializable接口是标识接口，它没有具体的实现方法
 * 2. 需要当前类提供一个全局常量      serialVersionUID ，值没有要求,用来做序列化的时候唯一标识，防止混乱。
 * 3. 除了当前Person类需要实现Serializable接口外，还必须保证其内部所有属性。
 *      也必须是可以序列化的。(默认情况下，基本数据类型可以序列化)
 *      如果属性中有类对象，那么类也必须实现Serializable接口。并添加serialVersionUID
 *
 *  补充:
 *      ObjectOutputStream和ObjectInputStream不能序列化static和transient修饰的成员变量。
 *       Java语言的关键字，变量修饰符，如果用transient声明一个实例变量，
 *       当对象存储时，它的值不需要维持。换句话来说就是，用transient关键字标记的成员变量不参与序列化过程。
 *
 */
public class Person implements Serializable {

    //序列版本号
    public static final long serialVersionUID = 42321412412L;

    private String name;

    private int age;

    private Account account;

    public Person(){

    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Account getAccount() {
        return account;
    }

    public void setAcount(Account account) {
        this.account = account;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

class Account implements Serializable{

    //序列版本号
    public static final long serialVersionUID = 423214124232L;


    private double balance;

    public Account(double balance) {
        this.balance = balance;
    }

    public double getBalance() {
        return balance;
    }

    public void setBalance(double balance) {
        this.balance = balance;
    }

    @Override
    public String toString() {
        return "Acount{" +
                "balance=" + balance +
                '}';
    }
}
